package gui.logado.mensagens.enviar;

import conexao.Http;
import conexao.HttpData;
import conexao.HttpListener;
import gui.utilitarias.filemanager.SelecionaListener;
import gui.utilitarias.filemanager.SelecionarArquivo;
import java.io.DataInputStream;
import java.io.IOException;
import javax.microedition.io.Connector;
import javax.microedition.io.file.FileConnection;
import javax.microedition.lcdui.*;
import recados.Recados;

public class Enviar extends Form implements CommandListener, ItemCommandListener, Runnable, SelecionaListener {

    private final TextField para;
    private final TextField mensagem;
    private final TextField arquivo;
    private final Command cmdVoltar;
    private final Command cmdEnviar;
    private final Command cmdProcurar;
    private final Command cmdRemover;
    private final Recados midlet;
    private Displayable back;
    private boolean anexo;

    public Enviar(Recados midlet) {
        super("Enviar Recado");

        this.midlet = midlet;

        para = new TextField("Para:", null, 20, TextField.ANY);
        mensagem = new TextField("Mensagem:", null, 200, TextField.ANY);
        arquivo = new TextField("Arquivo", null, 500, TextField.URL | TextField.UNEDITABLE);

        cmdVoltar = new Command("Voltar", Command.BACK, 0);
        cmdEnviar = new Command("Enviar", Command.OK, 1);

        cmdProcurar = new Command("Procurar", Command.ITEM, 0);
        cmdRemover = new Command("Remover", Command.ITEM, 1);

        para.addCommand(cmdProcurar);
        arquivo.addCommand(cmdProcurar);
        arquivo.addCommand(cmdRemover);

        para.setDefaultCommand(cmdProcurar);
        arquivo.setDefaultCommand(cmdProcurar);

        arquivo.setItemCommandListener(this);
        para.setItemCommandListener(this);

        append(para);
        append(mensagem);
        append(arquivo);

        addCommand(cmdVoltar);
        addCommand(cmdEnviar);

        setCommandListener(this);
    }

    public void commandAction(Command c, Displayable d) {
        if (c == cmdVoltar) {
            Recados.setCurrent(back);
        } else if (c == cmdEnviar) {
            if (getPara().size() < 1 || getMensagem().size() < 1 && !anexo) {
                Recados.setCurrent(new Alert("Ops", "Preencha os campos", null, AlertType.ALARM));
            } else {
                new Thread(this).start();
            }
        }
    }

    public void run() {
        HttpData data = new HttpData();
        data.setPagina("/envia_recado.php");

        data.put("de", Recados.getInstance().getLoginConfig().getNome());
        data.put("para", para.getString());
        data.put("mensagem", mensagem.getString());
        data.put("tipo", "recado");

        if (arquivo.getString() != null && arquivo.getString().length() > 0) {
            data.put("tipo", "arquivo");

            String url = arquivo.getString();
            String nome = url.substring(url.lastIndexOf('/', url.length() - 2));

            data.setArquivo("arquivo", nome, "aplication/octet-stream", url);
        }

        Http http = new Http(data.get("para"));
        http.setHttpData(data);

        HttpListener messageListener = new HttpListener() {

            public void requisicaoConcluida(DataInputStream in) {
                String primeiraLinha = Http.readLine(in);
                String segundaLinha = Http.readLine(in);

                if (primeiraLinha.equals("erro")) {
                    Recados.setCurrent(new Alert("Concluido", segundaLinha, null, AlertType.ERROR));
                } else if (primeiraLinha.equals("ok")) {
                    Enviar enviar = Recados.getInstance().getEnviar();
                    enviar.getMensagem().setString("");
                    enviar.getArquivo().setString(null);
                    enviar.setAnexo(false);

                    System.out.println("Mensagem enviada");
 
                    Recados.setCurrent(new Alert("Concluido",segundaLinha, null, AlertType.CONFIRMATION));
                }
            }

            public void requisicaoCancelada() {
                Recados.setCurrent(Recados.getInstance().getMensagens());
            }

            public void falhaRequisiçao(String mensagem) {
                Recados.setCurrent(new Alert("Concluido", mensagem, null, AlertType.ERROR));
            }
        };

        http.setListener(messageListener);


        http.doPost(false);
    }

    public void commandAction(Command c, Item item) {
        if (item == getArquivo()) {
            if (c == cmdProcurar) {
                SelecionarArquivo se = new SelecionarArquivo();
                se.setListener(this);
                se.switchToFiles(new String[]{"any"});
                Recados.setCurrent(se);
            } else if (c == cmdRemover) {
                getArquivo().setString(null);
                anexo = false;
            }
        } else if (item == getPara()) {
            if (c == cmdProcurar) {
                midlet.getUsuarios().setBack(this);
                Recados.setCurrent(midlet.getUsuarios());
            }
        }
    }

    public void arquivoSelecionado(final String url) {

        new Thread(new Runnable() {

            public void run() {
                try {
                    FileConnection verifica = (FileConnection) Connector.open("file:///" + url);

                    long size = verifica.fileSize();

                    if (size > 1024 * 200 || size < 1) {
                        Recados.setCurrent(new Alert("Erro", "Tamanho excedido", null, AlertType.ALARM));
                    } else {
                        getArquivo().setString("file:///" + url);
                        Recados.setCurrent(midlet.getEnviar());
                        anexo = true;
                    }
                } catch (IOException ex) {
                    Recados.setCurrent(new Alert("Erro", "Problema ao adicionar anexo", null, AlertType.ERROR));
                }
            }
        }).start();
    }

    public void setBack(Displayable back) {
        this.back = back;
    }

    public void cancela() {
        Recados.setCurrent(this);
    }

    /**
     * @return the para
     */
    public TextField getPara() {
        return para;
    }

    /**
     * @return the mensagem
     */
    public TextField getMensagem() {
        return mensagem;
    }

    /**
     * @return the arquivo
     */
    public TextField getArquivo() {
        return arquivo;
    }

    public void setAnexo(boolean anexo) {
        this.anexo = anexo;
    }
}
